home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue66 / Construc / Refactor / Source / fMainForm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2000-11-12  |  33.1 KB  |  952 lines

  1. unit fMainForm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, Buttons, ExtCtrls, ComCtrls,
  6.   FileCtrl, uSelectDir, uBuildingOBject, ActnList, Menus;
  7.  
  8. //DONE:  When editing something, be sure enabled and disabled buttons are right
  9. //       save button disabled until a change is made, save settings enabled only after save button used
  10. //DONE -cuser option: user option  auto increment,
  11. //DONE -cuser option: version info in project results and dump.dat,
  12. //DONE -cuser option: minimize on build,
  13. //DONE -cMain form: Add Main Menu
  14. //DONE -cMain form: refresh version info window on main form after build (each file)
  15. //DONE -cMain form: locate errors in results -- replaced by having a summary option
  16. //DONE -cBuilder object: publish user options
  17. //DONE -cMain form:  create user options form
  18. //DONE 1 -cBuilder object: Do not allow writing to .ver or .rc or .res files to halt everything.
  19.                        // fixed for .res, but still display or record error
  20. //todo -cBuilder object: user option to replace r/o files for .ver, .rc and .res?                       
  21. //DONE -cMain form:  Wrap long names in progress caption
  22. //DONE -cMain form:  wrap names in edit version window
  23. //DONE -cMain form:  summary report of all compiles with file version, appid, descriptions, etc on one line
  24.  
  25. //DONE -cBuilder object: Make sure same .ver file regardless of looking at .rc,.or .dpr
  26.  
  27. //DONE -cBuilder object: make sure .rc and .ver and .res go in source dir, (is .res going to  target dir?)
  28.  
  29. //Done -cBuilder object: AppId not showing up in lower right corner synposis of verison info.
  30.  
  31.  
  32. type
  33.   TeditingState = (esRightSide, esLeftSide, esBuilding, esNoProject, esBuildResults);
  34.  
  35.   TF_MainForm = class(TForm)
  36.     Panel1: TPanel;
  37.     StatusBar1: TStatusBar;
  38.     Panel2: TPanel;
  39.     Panel3: TPanel;
  40.     Panel4: TPanel;
  41.     Splitter1: TSplitter;
  42.     Panel9: TPanel;
  43.     Label6: TLabel;
  44.     cb_ProjectList: TComboBox;
  45.     bb_newProject: TBitBtn;
  46.     bb_save: TBitBtn;
  47.     Label1: TLabel;
  48.     Panel8: TPanel;
  49.     Label5: TLabel;
  50.     Panel10: TPanel;
  51.     b_editVersion: TBitBtn;
  52.     m_projectVersion: TMemo;
  53.     Splitter2: TSplitter;
  54.     Splitter3: TSplitter;
  55.     Panel6: TPanel;
  56.     Panel7: TPanel;
  57.     Label3: TLabel;
  58.     Panel11: TPanel;
  59.     Label4: TLabel;
  60.     Splitter5: TSplitter;
  61.     Panel13: TPanel;
  62.     b_editconfig: TBitBtn;
  63.     Panel14: TPanel;
  64.     BitBtn3: TBitBtn;
  65.     M_ConfigFile: TMemo;
  66.     ActionList1: TActionList;
  67.     A_editVersion: TAction;
  68.     L_Results: TLabel;
  69.     b_Build: TBitBtn;
  70.     b_exit: TBitBtn;
  71.     b_halt: TBitBtn;
  72.     Memo1: TMemo;
  73.     Panel15: TPanel;
  74.     b_editResourceMask: TButton;
  75.     b_save: TButton;
  76.     A_editFileList: TAction;
  77.     A_saveFileList: TAction;
  78.     A_EditConfig: TAction;
  79.     A_SaveConfig: TAction;
  80.     A_EditPath: TAction;
  81.     A_savePath: TAction;
  82.     A_addToPath: TAction;
  83.     A_DisplayDCCOptions: TAction;
  84.     A_NewProject: TAction;
  85.     A_saveProjectSettings: TAction;
  86.     A_DoBuild: TAction;
  87.     A_exit: TAction;
  88.     A_stopBuild: TAction;
  89.     A_EditRCMask: TAction;
  90.     A_SaveRCMask: TAction;
  91.     b_libPathUp: TBitBtn;
  92.     b_libPathDown: TBitBtn;
  93.     BitBtn4: TBitBtn;
  94.     LB_LibraryPath: TListBox;
  95.     b_addDir: TBitBtn;
  96.     b_DeleteDir: TBitBtn;
  97.     A_deletePath: TAction;
  98.     A_AddFile: TAction;
  99.     OpenDialog: TOpenDialog;
  100.     A_deleteFile: TAction;
  101.     A_projectOptions: TAction;
  102.     b_cancelEditwindow: TButton;
  103.     A_cancelEditWindow: TAction;
  104.     Panel5: TPanel;
  105.     Label2: TLabel;
  106.     Panel12: TPanel;
  107.     b_editFiles: TBitBtn;
  108.     b_fileDown: TBitBtn;
  109.     b_FileUp: TBitBtn;
  110.     b_addFile: TBitBtn;
  111.     b_deleteFile: TBitBtn;
  112.     LB_Files: TListBox;
  113.     Splitter4: TSplitter;
  114.     b_ideLibPath: TButton;
  115.     MainMenu1: TMainMenu;
  116.     miProject: TMenuItem;
  117.     miNew: TMenuItem;
  118.     miSaveProject: TMenuItem;
  119.     N1: TMenuItem;
  120.     miExit: TMenuItem;
  121.     miFiles: TMenuItem;
  122.     miAdd: TMenuItem;
  123.     miDelete: TMenuItem;
  124.     miEditFileList: TMenuItem;
  125.     miCompiler: TMenuItem;
  126.     miConfig: TMenuItem;
  127.     miDCC: TMenuItem;
  128.     miLibraryPath: TMenuItem;
  129.     miAddPath: TMenuItem;
  130.     miDeletepath: TMenuItem;
  131.     EditPath1: TMenuItem;
  132.     miResources: TMenuItem;
  133.     EditVersion1: TMenuItem;
  134.     EditRCMask1: TMenuItem;
  135.     miHelp: TMenuItem;
  136.     miContents: TMenuItem;
  137.     miAbout: TMenuItem;
  138.     miBuild: TMenuItem;
  139.     N2: TMenuItem;
  140.     miProjectOptions: TMenuItem;
  141.     LB_fileVersion: TListBox;
  142.     A_summary: TAction;
  143.     Button1: TButton;
  144.     A_OpenProject: TAction;
  145.     OpenProject1: TMenuItem;
  146.     A_retrieveLastDump: TAction;
  147.     Retrievelastdump1: TMenuItem;
  148.     b_DPKOptions: TBitBtn;
  149.     procedure bb_saveClick(Sender: TObject);
  150.     procedure FormCreate(Sender: TObject);
  151.     procedure A_editVersionExecute(Sender: TObject);
  152.     procedure LB_FilesClick(Sender: TObject);
  153.     procedure cb_ProjectListChange(Sender: TObject);
  154.     procedure FormDestroy(Sender: TObject);
  155.     procedure b_exitClick(Sender: TObject);
  156.     procedure A_editFileListExecute(Sender: TObject);
  157.     procedure A_saveFileListExecute(Sender: TObject);
  158.     procedure A_EditConfigExecute(Sender: TObject);
  159.     procedure A_SaveConfigExecute(Sender: TObject);
  160.     procedure A_DisplayDCCOptionsExecute(Sender: TObject);
  161.     procedure b_FileUpClick(Sender: TObject);
  162.     procedure A_saveProjectSettingsExecute(Sender: TObject);
  163.     procedure b_fileDownClick(Sender: TObject);
  164.     procedure b_libPathUpClick(Sender: TObject);
  165.     procedure b_libPathDownClick(Sender: TObject);
  166.     procedure A_addToPathExecute(Sender: TObject);
  167.     procedure A_deletePathExecute(Sender: TObject);
  168.     procedure A_AddFileExecute(Sender: TObject);
  169.     procedure A_DoBuildExecute(Sender: TObject);
  170.     procedure b_haltClick(Sender: TObject);
  171.     procedure A_deleteFileExecute(Sender: TObject);
  172.     procedure A_savePathExecute(Sender: TObject);
  173.     procedure A_EditRCMaskExecute(Sender: TObject);
  174.     procedure A_EditPathExecute(Sender: TObject);
  175.     procedure A_SaveRCMaskExecute(Sender: TObject);
  176.     procedure A_cancelEditWindowExecute(Sender: TObject);
  177.     procedure Memo1Change(Sender: TObject);
  178.     procedure A_NewProjectExecute(Sender: TObject);
  179.     procedure b_ideLibPathClick(Sender: TObject);
  180.     procedure A_projectOptionsExecute(Sender: TObject);
  181.     procedure LB_FilesDrawItem(Control: TWinControl; Index: Integer;
  182.       Rect: TRect; State: TOwnerDrawState);
  183.     procedure A_summaryExecute(Sender: TObject);
  184.     procedure A_retrieveLastDumpExecute(Sender: TObject);
  185.     procedure miContentsClick(Sender: TObject);
  186.     procedure miAboutClick(Sender: TObject);
  187.   private
  188.     fBuilderProjectList : tstringlist;
  189.     fProjectDir : string;
  190.     fProjectName : string;
  191.     fFileName : string;
  192.     fTargetFile : string;
  193.     fProjectChanged : boolean;
  194.     fEditState: TeditingState;
  195.     procedure SaveSettings;
  196.     procedure SelectFile(value: integer);
  197.     // builder object event handlers
  198.     procedure HandleCompileEnd(const aSourceFile, aDestFile,
  199.       aErrMsg: string; aSuccess: boolean; alines, ahints, awarnings,
  200.       aerrors, afatal: integer);
  201.     procedure HandleCompileNotify(const aSourcefile, Info: string);
  202.     procedure HandleCompileStart(const aSourceFile, aDestFile,
  203.       aErrMsg: string);
  204.     Procedure OnProjectStart(const aSourcefile, Info : string);
  205.     procedure HandleProjectDone(const aProjectName: string; aOK, aErr,
  206.       alines, ahints, awarnings, aerrors, afatal: integer);
  207.     procedure HandleProjectHalt(const aSourcefile, Info : string);
  208.     //procedure clearResults;
  209.     procedure SetSettingsChanged(const Value: boolean);
  210.     Procedure DisableSettings;
  211.     procedure EnableSettings;
  212.     //procedure PrepResults;
  213.     procedure redrawcaptions;
  214.     procedure SetEditState(const Value: TeditingState);
  215.   public
  216.     BuilderObject : TBuilderClass;
  217.     function MakeEllipsisFilename(const fn: string; aWidth: integer;
  218.       aCanvas: tcanvas): string;
  219.     Property SettingsChanged : boolean read fProjectChanged write SetSettingsChanged;
  220.     Property EditState : TeditingState read fEditState write SetEditState;
  221.   end;
  222.  
  223. var
  224.   F_MainForm: TF_MainForm;
  225.  
  226. implementation
  227. uses inifiles, feditversion, DOSToMemo, uRCBuilder, IDELibPath, fOptions, fDCCoptions, fabout;
  228. const cProject = 'Projects';
  229.  
  230. {$R *.DFM}
  231.  
  232. procedure TF_MainForm.bb_saveClick(Sender: TObject);
  233. begin
  234.   BuilderOBject.InitializeProject(fProjectDir);
  235.   if not BuilderObject.SaveProjectSettings
  236.     then begin
  237.       showmessage('Failed to save project settings');
  238.       SettingsChanged := true;
  239.       end
  240.     else SettingsChanged := false;
  241. end;
  242.  
  243. procedure TF_MainForm.FormCreate(Sender: TObject);
  244. var i : integer;
  245. begin
  246.   If BuilderObject = nil
  247.     then BuilderObject :=  TBuilderClass.create(self);
  248.   BuilderObject.OnProjectHalt := HandleProjectHalt;
  249.   BuilderObject.OnCompileEvent := HandleCompileNotify;
  250.   BuilderObject.OnCompileStart := HandleCompileStart;
  251.   BuilderObject.OnCompileEnd := HandleCompileEnd;
  252.   BuilderObject.OnProjectDone := HandleProjectDone;
  253.   fBuilderProjectList := tstringlist.create;
  254.   with tinifile.create(ChangeFileExt(application.exename, '.ini')) do begin
  255.     readSectionvalues(cProject, fBuilderProjectList);
  256.     free;
  257.     end;
  258.   if fBuilderProjectList.count > 0
  259.     then begin
  260.       for i := 0 to fBuilderProjectList.count-1 do
  261.         cb_ProjectList.items.add(fBuilderProjectList.names[i]);
  262.       cb_ProjectList.itemindex := 0;
  263.       cb_ProjectListChange(sender);
  264.       LB_files.itemindex := 0;
  265.       LB_FilesClick(sender);
  266.       EditState := esNoProject;
  267.       end
  268.     else cb_projectList.text := '';
  269.   EditState := esLeftSide;
  270.   SettingsChanged := false;
  271. end;
  272.  
  273.  
  274. procedure TF_MainForm.A_editVersionExecute(Sender: TObject);
  275. begin
  276.    with Tf_editversion.EditSavings(BuilderObject, fProjectName, fFileName) do begin
  277.      if showmodal = mrOK
  278.        then begin
  279.           BuilderObject.ResourceHandler.ClearSettings;
  280.           BuilderObject.ResourceHandler.GetSettings(SlashSep(fProjectDir, cProjectList), rsProject);
  281.           m_projectVersion.lines.text := BuilderObject.ResourceHandler.DisplayRCData(' from Files.ini');
  282.           BuilderObject.ResourceHandler.ClearSettings;
  283.           BuilderObject.ResourceHandler.GetSettings(ChangeFileExt(fFileName, '.VER'), rsFile);
  284.           LB_fileVersion.items.text := BuilderObject.ResourceHandler.DisplayRCData('from '+
  285.                                        MakeEllipsisFilename(ChangeFileExt(fFileName, '.VER'),
  286.                                                            LB_fileVersion.Width - lb_fileVersion.canvas.textwidth('from '),
  287.                                                            LB_fileVersion.Canvas) );
  288.  
  289.          end;
  290.      free;
  291.      end;
  292. end;
  293.  
  294. procedure TF_MainForm.SelectFile(value : integer);
  295. begin
  296.   if LB_files.items.count = 0 then exit;
  297.   with LB_files do begin
  298.     if (value < 0) or (value > items.count-1)
  299.       then begin
  300.         value := 0;
  301.         itemindex := value;
  302.         end;
  303.     fFileName := copy(Items[value], pos('=',items[value])+1, 200);
  304.     fTargetFile := copy(Items[value], 1, pos('=',items[value])-1);
  305.     end;
  306.   if (pos('.RC', uppercase(fFileName)) > 0)
  307.       and
  308.       BuilderObject.IsIndependentRCFile(fFileName)
  309.     then LB_FileVersion.items.text := 'Independent resource file'
  310.     else begin
  311.       BuilderObject.ResourceHandler.ClearSettings;
  312.       BuilderObject.ResourceHandler.GetSettings(ChangeFileExt(fFileName, '.VER'), rsFile);
  313.       LB_fileVersion.items.text := BuilderObject.ResourceHandler.DisplayRCData('from '+
  314.                                    MakeEllipsisFilename(ChangeFileExt(fFileName, '.VER'),
  315.                                                         LB_fileVersion.Width - lb_fileVersion.canvas.textwidth('from '),
  316.                                                         LB_fileVersion.Canvas) );
  317.       end;
  318. end;
  319.  
  320. procedure TF_MainForm.LB_FilesClick(Sender: TObject);
  321. begin
  322.   SelectFile(LB_files.itemindex);
  323. end;
  324.  
  325. procedure TF_MainForm.cb_ProjectListChange(Sender: TObject);
  326. begin
  327.   lb_files.items.clear;
  328.   m_configFile.clear;
  329.   LB_LibraryPath.items.clear;
  330.   m_projectVersion.clear;
  331.   LB_fileVersion.items.clear;
  332.   fProjectName := cb_projectList.Text;
  333.   fProjectDir := fBuilderProjectList.values[fProjectName];
  334.   BuilderObject.InitializeProject(fProjectDir);
  335.   lb_files.items.assign(BuilderObject.ProjectList);
  336.   m_configFile.Lines.assign(BuilderObject.ConfigFile);
  337.   LB_LibraryPath.items.assign(BuilderOBject.LibraryFile);
  338.   BuilderObject.ResourceHandler.ClearSettings;
  339.   BuilderObject.ResourceHandler.GetSettings(SlashSep(fProjectDir, cProjectList), rsProject);
  340.   m_projectVersion.lines.text := BuilderObject.ResourceHandler.DisplayRCData('from Files.ini');
  341. end;
  342.  
  343. procedure TF_MainForm.FormDestroy(Sender: TObject);
  344. begin
  345.   fBuilderProjectList.free;
  346. end;
  347.  
  348. procedure TF_MainForm.redrawcaptions;
  349. begin
  350.   l_results.invalidate;
  351.   StatusBar1.invalidate;
  352.   application.processmessages;
  353. end;
  354.  
  355. procedure TF_MainForm.HandleCompileEnd(const aSourceFile, aDestFile,
  356.   aErrMsg: string; aSuccess: boolean; alines, ahints, awarnings, aerrors,
  357.   afatal: integer);
  358. begin
  359.   // it turns out this goes by too fast to be seen...
  360.   l_results.caption := 'Done with compiling '+#13#10+MakeEllipsisFilename(asourcefile, l_results.Width, l_results.Canvas)+#13#10+
  361.                        ' to '+MakeEllipsisFilename(aDestFile, l_results.Width, l_results.Canvas)+ #13#10+
  362.                        aErrMsg;
  363.   StatusBar1.simpleText := aErrMsg+'  Lines: '+IntToStr(alines)+ ',  Hints: '+IntToStr(aHints)+ ',  Warnings: '+IntToStr(aWarnings)+',  Errors: '+IntToStr(aErrors)+',   Fatal: '+IntToStr(aFatal);
  364.   redrawcaptions;
  365. end;
  366.  
  367. procedure TF_MainForm.HandleCompileNotify(const aSourcefile, Info: string);
  368. begin
  369.   l_results.caption := MakeEllipsisFilename(asourcefile, l_results.Width, l_results.Canvas) + #13#10+Info;
  370.   //memo1.lines.add(asourcefile + ': '+Info);
  371.   StatusBar1.simpleText := asourcefile + ': '+Info;
  372.   redrawcaptions;
  373. end;
  374.  
  375. procedure TF_MainForm.OnProjectStart(const aSourcefile, Info: string);
  376. begin
  377.   l_results.caption := 'Starting build '+MakeEllipsisFilename(fProjectDir, l_results.Width, l_results.Canvas) + #13#10 + Info;
  378.   redrawcaptions;
  379.   EditState := esBuilding;
  380. end;
  381.  
  382. procedure TF_MainForm.HandleCompileStart(const aSourceFile, aDestFile,
  383.   aErrMsg: string);
  384. begin
  385.   l_results.caption := 'Start compiling '+#13#10+MakeEllipsisFilename(asourcefile, l_results.Width, l_results.Canvas)+#13#10+
  386.                        ' to '+MakeEllipsisFilename(aDestFile, l_results.Width, l_results.Canvas)+ #13#10+
  387.                        aErrMsg;
  388.   lb_files.Itemindex := lb_files.items.IndexOfName(aDestFile);
  389.   redrawcaptions;
  390. end;
  391.  
  392. procedure TF_MainForm.HandleProjectDone(const aProjectName: string; aOK,
  393.   aErr, alines, ahints, awarnings, aerrors, afatal: integer);
  394. begin
  395.   enableSettings;
  396.   L_results.caption := 'Project '+fprojectName +' is done.'+#13#10+ 'Final result is '+IntToStr(aOK)+' OK, '+IntToStr(aErr)+' ERR.';
  397.   StatusBar1.simpleText := 'Final result is '+IntToStr(aOK)+' OK, '+IntToStr(aErr)+' ERR.   Lines: '+IntToStr(alines)+ ',  Hints: '+IntToStr(aHints)+ ',  Warnings: '+IntToStr(aWarnings)+',  Errors: '+IntToStr(aErrors)+',   Fatal: '+IntToStr(aFatal);
  398.   Memo1.lines.add(#13#10+'Project Summary: '+#13#10);
  399.   memo1.lines.addstrings(BuilderObject.ProjectSummary);
  400.   Memo1.lines.add(#13#10+'Detailed output: '+#13#10);
  401.   memo1.lines.addstrings(BuilderObject.ProjectResults);
  402.   redrawcaptions;
  403.   b_save.Action := A_Summary;
  404. end;
  405.  
  406. procedure TF_MainForm.HandleProjectHalt(const aSourcefile, Info: string);
  407. begin
  408.   L_results.caption := 'Builder Halted: '+#13#10+aSourceFile+#13#10+Info;
  409.   memo1.lines.add(L_results.caption);
  410.   Memo1.lines.add(#13#10+'Project Summary: '+#13#10);
  411.   memo1.lines.addstrings(BuilderObject.ProjectSummary);
  412.   Memo1.lines.add(#13#10+'Detailed output: '+#13#10);
  413.   memo1.lines.addstrings(BuilderObject.ProjectResults);
  414.   b_save.Action := A_Summary;
  415.   if BuilderObject.HaltOnError
  416.     then if MessageDlg('Error: '+Info+#13#10+'Do you want to halt the build?', mtconfirmation, [mbyes, mbNo],0) = mrYes
  417.            then begin
  418.              BuilderObject.HaltNow := true;
  419.              memo1.lines.add('User halted build ');
  420.              enableSettings;
  421.              end
  422.            else BuilderObject.haltNow := false;
  423. end;
  424.  
  425. procedure TF_MainForm.b_exitClick(Sender: TObject);
  426. begin
  427.   If SettingsChanged
  428.     then SaveSettings;
  429.   close;
  430. end;
  431.  
  432.  
  433.  
  434. procedure TF_MainForm.A_editFileListExecute(Sender: TObject);
  435. begin
  436.    L_Results.caption := 'Editing Files List for '+fProjectName;
  437.    EditState := esRightSide;
  438.    memo1.lines.assign(lb_files.items);
  439.    Memo1.onChange := Memo1Change;
  440.    b_save.action := A_SaveFileList; //OnClick := SaveFiles(sender);
  441. end;
  442.  
  443. procedure TF_MainForm.A_saveFileListExecute(Sender: TObject);
  444. begin
  445.   BuilderObject.ProjectList.Assign(memo1.lines);
  446.   lb_files.items.assign(memo1.lines);
  447.   EditState := esLeftSide;
  448. end;
  449.  
  450. procedure TF_MainForm.A_EditConfigExecute(Sender: TObject);
  451. begin
  452.   CreateDOSProcessRedirected('DCC32.exe /?', ChangeFileExt(application.exename, '.ini'), SlashSep(ExtractFilePath(application.exename), 'options.txt'), 'getting /? ');
  453.   f_dccoptions := Tf_dccoptions.create(application);
  454.   f_dccoptions.Memo1.lines.LoadFromFile(slashSep(ExtractFilePath(application.exename),'options.txt'));
  455.   f_dccoptions.show;
  456.   L_results.caption := 'Editing Configuration File for '+fProjectName;
  457.   EditState := esRightSide;
  458.   memo1.lines.assign(m_configfile.lines);
  459.   Memo1.onChange := Memo1Change;
  460.   b_save.action := A_SaveConfig;
  461. end;
  462.  
  463. procedure TF_MainForm.A_SaveConfigExecute(Sender: TObject);
  464. begin
  465.  BuilderObject.ConfigFile.assign(memo1.lines);
  466.  memo1.lines.savetofile(slashSep(fprojectdir, cConfig));
  467.  m_configFile.lines.assign(memo1.lines);
  468.  EditState := esLeftSide;
  469.  f_dccoptions.free;
  470.  f_dccoptions := nil;
  471. end;
  472.  
  473. procedure TF_MainForm.A_DisplayDCCOptionsExecute(Sender: TObject);
  474. begin
  475.   EditState := esRightSide;
  476.   CreateDOSProcessRedirected('DCC32.exe /?', ChangeFileExt(application.exename, '.ini'), SlashSep(ExtractFilePath(application.exename), 'options.txt'), 'getting /? ');
  477.   L_results.caption := 'DCC32 /Help output'+#13#10+'Stored in '+#13#10+SlashSep(ExtractFilePath(application.exename), 'options.txt');;
  478.   memo1.Lines.LoadFromFile(SlashSep(ExtractFilePath(application.exename), 'options.txt'));
  479. end;
  480.  
  481. procedure TF_MainForm.b_FileUpClick(Sender: TObject);
  482. var i : integer;
  483. begin
  484.   i := lb_files.itemindex;
  485.   if (i = -1) or (i = 0) then exit;
  486.   lb_files.Items.Move(lb_files.itemindex, lb_files.itemindex-1);
  487.   lb_files.itemindex := i-1;
  488.   BuilderObject.ProjectList.assign(lb_files.items);
  489.   SettingsChanged := true;
  490.   SelectFile(LB_files.itemindex);
  491. end;
  492.  
  493. procedure TF_MainForm.b_fileDownClick(Sender: TObject);
  494. var i : integer;
  495. begin
  496.   i := LB_Files.itemindex;
  497.   if (i = -1) or (i = LB_Files.items.count-1) then exit;
  498.   LB_Files.Items.Move(LB_Files.itemindex, LB_Files.itemindex+1);
  499.   LB_Files.itemindex := i+1;
  500.   BuilderObject.ProjectList.assign(lb_files.items);
  501.   SettingsChanged := true;
  502.   SelectFile(LB_files.itemindex);
  503. end;
  504.  
  505. procedure TF_MainForm.SetSettingsChanged(const Value: boolean);
  506. begin
  507.   fProjectChanged := Value;
  508.   A_SaveProjectSettings.enabled := value;
  509. end;
  510.  
  511. procedure TF_MainForm.A_saveProjectSettingsExecute(Sender: TObject);
  512. begin
  513.    if not BuilderObject.SaveProjectSettings
  514.       then begin
  515.             showmessage('Failed to save project settings');
  516.             SettingsChanged := true;
  517.             end
  518.       else SettingsChanged := false;
  519. end;
  520.  
  521. procedure TF_MainForm.SaveSettings;
  522. begin
  523.   If MessageDlg('Project '+fProjectdir+' has changed.  Do you wish to save the changes?', mtConfirmation, [mbYEs, mbNo],0) = mrYes
  524.     then A_saveProjectSettings.execute;
  525.   b_Build.default := true;
  526. end;
  527.  
  528.  
  529. procedure TF_MainForm.b_libPathUpClick(Sender: TObject);
  530. var i : integer;
  531. begin
  532.   i := LB_LibraryPath.itemindex;
  533.   if (i = -1) or (i = 0) then exit;
  534.   LB_LibraryPath.Items.Move(LB_LibraryPath.itemindex, LB_LibraryPath.itemindex-1);
  535.   LB_LibraryPath.itemindex := i-1;
  536.   BuilderObject.LibraryFile.Assign(LB_LibraryPath.items);
  537.   SettingsChanged := true;
  538. end;
  539.  
  540.  
  541.  
  542. procedure TF_MainForm.b_libPathDownClick(Sender: TObject);
  543. var i : integer;
  544. begin
  545.   i := LB_LibraryPath.itemindex;
  546.   if (i = -1) or (i = LB_LibraryPath.items.count-1) then exit;
  547.   LB_LibraryPath.Items.Move(LB_LibraryPath.itemindex, LB_LibraryPath.itemindex+1);
  548.   LB_LibraryPath.itemindex := i+1;
  549.   BuilderObject.LibraryFile.Assign(LB_LibraryPath.items);
  550.   SettingsChanged := true;
  551. end;
  552.  
  553. procedure TF_MainForm.A_addToPathExecute(Sender: TObject);
  554. var dir : string;
  555. begin
  556.   GetDir(0,dir);
  557.   if MySelectDirectory('Select Path to Add', dir, [sdAllowCreate, sdPerformCreate, sdPrompt],0)
  558.     then begin
  559.       LB_LibraryPath.items.add(dir);
  560.       BuilderObject.LibraryFile.Assign(LB_LibraryPath.items);
  561.       SettingsChanged := true;
  562.       end;
  563. end;
  564.  
  565. procedure TF_MainForm.A_deletePathExecute(Sender: TObject);
  566. var i : integer;
  567. begin
  568.   i := LB_LibraryPath.itemindex;
  569.   LB_LibraryPath.items.delete(LB_LibraryPath.itemindex);
  570.   if i < LB_LibraryPath.items.count
  571.     then LB_LibraryPath.itemindex := i;
  572.   BuilderObject.LibraryFile.Assign(LB_LibraryPath.items);
  573.   SettingsChanged := true;
  574. end;
  575.  
  576. procedure TF_MainForm.A_AddFileExecute(Sender: TObject);
  577. var i,x : integer;
  578.     dir, fname : string;
  579.     CurrentTargetDir : string;
  580. begin
  581.   if lb_files.itemindex = -1
  582.     then lb_files.itemindex := lb_files.items.count-1;
  583.   x := lb_files.itemindex;
  584.   if x = -1
  585.     then currentTargetDir := extractFilePath(application.exename)
  586.     else CurrentTargetDir := extractFilePath(Lb_files.items.Names[lb_files.Itemindex]);
  587.   with opendialog do begin
  588.     filter := 'Project files (dpr, res)|*.dpr;*.res;*.rc';
  589.     options := [ofHideReadOnly,ofAllowMultiSelect,ofPathMustExist,ofFileMustExist,ofEnableSizing];
  590.     Title := 'select file(s) (dpr or res or rc) to be in project';
  591.     if execute
  592.       then begin
  593.         for i := 0 to files.count-1 do begin
  594.           // change .res to .rc, even though it doesn't exist yet
  595.           if pos('.RES', uppercase(files[i])) > 0
  596.             then files[i] := changeFileExt(files[i], '.RC');
  597.           fname := extractfilename(files[i]);
  598.           dir := CurrentTargetDir;
  599.           if not MySelectDirectory('Select Target Directory', dir, [sdAllowCreate, sdPerformCreate, sdPrompt],0)
  600.             then dir := extractFilePath(files[i]);
  601.           CurrentTArgetDir := dir;
  602.           if pos('.EXE', uppercase(fname)) > 0
  603.             then fname := changeFileExt(fname, '.exe')
  604.           else if pos('.dpk', fname) > 0
  605.             then fname := changeFileExt(fname, '.bpl')
  606.           else if pos('.RC', uppercase(fname)) > 0
  607.             then fname := changeFileExt(fname, '.res');
  608.           if x = lb_files.items.count-1
  609.             then lb_files.items.add(dir+'\'+fname+'='+files[i])
  610.             else lb_files.items.insert(x, dir+'\'+fname+'='+files[i]);
  611.           end;
  612.         BuilderObject.ProjectList.assign(lb_files.items);
  613.         SettingsChanged := true;
  614.         end;
  615.     end;
  616. end;
  617.  
  618. procedure TF_MainForm.A_DoBuildExecute(Sender: TObject);
  619. begin
  620.   If SettingsChanged
  621.     then saveSettings;
  622.   if BuilderObject.MinimizeOnBuild
  623.     then application.Minimize;
  624.   BuilderObject.HaltNow := false;
  625.   EditState := esBuilding;
  626.   A_summary.caption := 'Summary';
  627.   BuilderObject.execute;
  628.   if BuilderObject.MinimizeOnBuild
  629.     then application.Restore;
  630.   b_exit.default := true;
  631.   BuilderObject.ResourceHandler.ClearSettings;
  632.   BuilderObject.ResourceHandler.GetSettings(SlashSep(fProjectDir, cProjectList), rsProject);
  633.   m_projectVersion.lines.text := BuilderObject.ResourceHandler.DisplayRCData('From files.ini');
  634.   SelectFile(LB_files.itemindex);
  635. end;
  636.  
  637. procedure TF_MainForm.DisableSettings;
  638. begin
  639.   A_NewProject.enabled := true;
  640.   A_editVersion.enabled := false;
  641.   A_editConfig.enabled := false;
  642.   A_editPath.enabled := false;
  643.   A_addToPath.enabled := false;
  644.   A_DisplayDCCoptions.enabled := false;
  645.   A_newProject.enabled := false;
  646.   A_editRCMask.enabled := false;
  647.   A_DeletePath.enabled := false;
  648.   A_addFile.enabled := false;
  649.   a_deletePath.enabled := false;
  650.   A_editFileList.enabled := false;
  651.   A_deleteFile.enabled := false;
  652.   b_fileup.enabled := false;
  653.   b_fileDown.enabled := false;
  654.   b_libPathUp.enabled := false;
  655.   b_libPathDown.enabled := false;
  656. end;
  657.  
  658. procedure TF_MainForm.EnableSettings;
  659. begin
  660.   A_NewProject.enabled := true;
  661.   A_editVersion.enabled := true;
  662.   A_editConfig.enabled := true;
  663.   A_editPath.enabled := true;
  664.   A_addToPath.enabled := true;
  665.   A_DisplayDCCoptions.enabled := true;
  666.   A_newProject.enabled := true;
  667.   A_editRCMask.enabled := true;
  668.   A_DeletePath.enabled := true;
  669.   A_addFile.enabled := true;
  670.   a_deletePath.enabled := true;
  671.   A_editFileList.enabled := true;
  672.   A_deleteFile.enabled := true;
  673.   b_fileup.enabled := true;
  674.   b_fileDown.enabled := true;
  675.   b_libPathUp.enabled := true;
  676.   b_libPathDown.enabled := true;
  677.   a_DoBuild.enabled := true;
  678. end;
  679.  
  680.  
  681. procedure TF_MainForm.b_haltClick(Sender: TObject);
  682. begin
  683.   BuilderObject.HaltNow := true;
  684. end;
  685.  
  686. procedure TF_MainForm.A_deleteFileExecute(Sender: TObject);
  687. var i : integer;
  688. begin
  689.   i := LB_Files.itemindex;
  690.   LB_Files.items.delete(LB_Files.itemindex);
  691.   if i < LB_Files.items.count
  692.     then LB_Files.itemindex := i;
  693.   BuilderObject.ProjectList.assign(lb_files.items);
  694.   SettingsChanged := true;
  695. end;
  696.  
  697. procedure TF_MainForm.A_EditPathExecute(Sender: TObject);
  698. begin
  699.    L_Results.caption := 'Editing Library Path for '+fProjectName;
  700.    EditState := esRightSide;
  701.    b_ideLibPath.visible := true;
  702.    memo1.lines.assign(LB_LibraryPath.items);
  703.    Memo1.onChange := Memo1Change;
  704.    b_save.action := A_SavePath; //OnClick := SaveFiles(sender);
  705. end;
  706.  
  707. procedure TF_MainForm.A_savePathExecute(Sender: TObject);
  708. begin
  709.   BuilderObject.LibraryFile.Assign(memo1.lines);
  710.   LB_LibraryPath.items.assign(memo1.lines);
  711.   EditState := esLeftSide;
  712. end;
  713.  
  714. procedure TF_MainForm.A_EditRCMaskExecute(Sender: TObject);
  715. begin
  716.    L_Results.caption := 'Editing RC Mask for '+fProjectName;
  717.    EditState := esRightSide;
  718.    memo1.lines.loadFromFile(SlashSep(fprojectdir, cResourceMask));
  719.    Memo1.onChange := Memo1Change;
  720.    b_save.action := A_SaveRCMask;
  721. end;
  722.  
  723. procedure TF_MainForm.A_SaveRCMaskExecute(Sender: TObject);
  724. begin
  725.   memo1.lines.SaveToFile(SlashSep(fprojectdir, cResourceMask));
  726.   EditState := esLeftSide;
  727. end;
  728.  
  729. procedure TF_MainForm.SetEditState(const Value: TeditingState);
  730.   procedure ClearResults;
  731.   begin
  732.     Memo1.clear;
  733.     memo1.Color := clInactiveCaptionText;
  734.   end;
  735.  
  736. begin
  737.   fEditState := Value;
  738.   case value of
  739.     esRightSide : begin
  740.                     b_save.visible := true;
  741.                     A_cancelEditWindow.visible := true;
  742.                     A_cancelEditWindow.Enabled := true;
  743.                     memo1.clear;
  744.                     memo1.color := clWindow;
  745.                     disableSettings;
  746.                     Memo1.setfocus;
  747.                     end;
  748.     esLeftSide  : begin
  749.                     b_save.visible := false;
  750.                     A_cancelEditWindow.visible := false;
  751.                     b_ideLibPath.visible := false;
  752.                     clearResults;
  753.                     enableSettings;
  754.                     memo1.onChange := nil;
  755.                     end;
  756.     esBuilding  : begin
  757.                     b_halt.enabled := true;
  758.                     A_DoBuild.Enabled := false;
  759.                     ClearResults;
  760.                     DisableSettings;
  761.                     memo1.onChange := nil;
  762.                     end;
  763.     esNoProject : begin
  764.                     //ClearResults;
  765.                     EnableSettings;
  766.                     memo1.onChange := nil;
  767.                     end;
  768.     esBuildResults : ;
  769.     end;
  770. end;
  771.  
  772. procedure TF_MainForm.A_cancelEditWindowExecute(Sender: TObject);
  773. begin
  774.   EditState := esLeftSide;
  775.   if f_dccoptions <> nil
  776.     then begin
  777.        f_dccoptions.free;
  778.        f_dccoptions := nil;
  779.        end;
  780. end;
  781.  
  782. procedure TF_MainForm.Memo1Change(Sender: TObject);
  783. begin
  784.   SettingsChanged := true;
  785. end;
  786.  
  787. procedure TF_MainForm.A_NewProjectExecute(Sender: TObject);
  788. var dir : string;
  789.     i : integer;
  790. begin
  791.   if MySelectDirectory('Select Project specs directory', dir, [sdAllowCreate, sdPerformCreate, sdPrompt],0)
  792.     then begin
  793.       if fProjectChanged
  794.         then SaveSettings;
  795.       fProjectDir := dir;
  796.       for i := length(dir) downto 1 do
  797.         if dir[i] = '\'
  798.           then begin
  799.             fProjectName := copy(dir, i+1, 200);
  800.             break;
  801.             end;
  802.       cb_projectList.items.add(fprojectNAme);
  803.       cb_projectList.text := fProjectNAme;
  804.       fBuilderProjectList.add(fProjectName+'='+fProjectDir);
  805.       with tinifile.create(ChangeFileExt(application.exename, '.ini')) do begin
  806.         writeString(cProject, fProjectName, fProjectDir);
  807.         free;
  808.         end;
  809.       end;
  810. end;
  811.  
  812. procedure TF_MainForm.b_ideLibPathClick(Sender: TObject);
  813. var tmpsl : tstringlist;
  814. begin
  815.   tmpsl := GetIDELibraryPath;
  816.   if tmpsl <> nil
  817.     then begin
  818.       Memo1.lines.assign(tmpsl);
  819.       tmpsl.free;
  820.       SettingsChanged := true;
  821.       end;
  822.  
  823. end;
  824.  
  825. procedure TF_MainForm.A_projectOptionsExecute(Sender: TObject);
  826. begin
  827.   with Tf_options.create(nil) do begin
  828.     cb_autoincrement.checked := BuilderObject.AutoIncrement;
  829.     cb_AutoComment.checked := BuilderObject.IncrementComment;
  830.     cb_minimize.checked := BuilderObject.MinimizeOnBuild;
  831.     cb_CheckVersion.checked := BuilderObject.CheckVersion;
  832.     cb_VerInfoInVerFile.checked := BuilderObject.ActualVerInfoInVerFile;
  833.     cb_HaltOnError.checked := BuilderObject.HaltOnError;
  834.     if ShowModal = mrOK
  835.       then begin
  836.         If (BuilderObject.AutoIncrement <> cb_autoincrement.checked)
  837.             or
  838.            (BuilderObject.IncrementComment <> cb_AutoComment.checked)
  839.             or
  840.            (BuilderObject.MinimizeOnBuild <> cb_minimize.checked)
  841.             or
  842.            (BuilderObject.CheckVersion <> cb_CheckVersion.checked)
  843.             or
  844.            (BuilderObject.ActualVerInfoInVerFile <> cb_VerInfoInVerFile.checked)
  845.             or
  846.            (BuilderObject.HaltOnError <> cb_HaltOnError.checked)
  847.           then SettingsChanged := true;
  848.         BuilderObject.AutoIncrement := cb_autoincrement.checked;
  849.         BuilderObject.IncrementComment := cb_AutoComment.checked;
  850.         BuilderObject.MinimizeOnBuild := cb_minimize.checked;
  851.         BuilderObject.CheckVersion := cb_CheckVersion.checked;
  852.         BuilderObject.ActualVerInfoInVerFile := cb_VerInfoInVerFile.checked;
  853.         BuilderObject.HaltOnError := cb_HaltOnError.checked;
  854.         end;
  855.     free;
  856.     end;
  857. end;
  858.  
  859. function TF_MainForm.MakeEllipsisFilename(const fn : string; aWidth : integer; aCanvas : tcanvas): string;
  860. var fronthalf, backHalf : string;
  861.     i : integer;
  862. begin
  863.   result := fn;
  864.   if aCanvas.TextWidth(result) <= aWidth
  865.     then exit;
  866.   i := pos('\', result);
  867.   fronthalf := copy(result, 1, i);
  868.   backhalf := copy(result, i+1, 256);
  869.   repeat
  870.     i := pos('\', backhalf);
  871.     if i = 0
  872.       then break;
  873.     system.delete(backhalf, 1, i);
  874.     result := fronthalf+'...\'+backhalf;
  875.     until aCanvas.TextWidth(result) <= aWidth;
  876. end;
  877.  
  878. procedure TF_MainForm.LB_FilesDrawItem(Control: TWinControl;
  879.   Index: Integer; Rect: TRect; State: TOwnerDrawState);
  880. var tmp, dest, src : string;
  881. begin
  882.   tmp := LB_Files.items[index];
  883.   dest := copy(tmp, 1, pos('=', tmp)-1);
  884.   src := copy(tmp, pos('=', tmp)+1, 250);
  885.   tmp := MakeEllipsisFilename(dest, (lb_files.width-20) div 2, lb_files.Canvas)+ '=' +
  886.          MakeEllipsisFilename(src, (lb_files.width-20) div 2, lb_files.Canvas);
  887.   with (Control as tListBox).canvas do begin
  888.     fillRect(rect);
  889.     TextOut(Rect.Left+1, Rect.Top, tmp);
  890.     //TextRect(rect, 1,1,tmp);
  891.     end;
  892. end;
  893.  
  894. procedure TF_MainForm.A_summaryExecute(Sender: TObject);
  895. var i : integer;
  896.     tmpsl : tstringlist;
  897.     dump : tstringlist;
  898. begin
  899.   if A_Summary.caption = 'Summary'
  900.     then begin
  901.       dump := tstringlist.create;
  902.       dump.loadfromfile(builderobject.ProjectDir+'\dump.dat');
  903.       tmpsl := tstringlist.create;
  904.       for i := 0 to dump.count-1 do begin
  905.         if
  906.            (pos('Build ', dump[i]) = 1)
  907.             or
  908.            (pos('OK:', dump[i]) = 1)
  909.             or
  910.            (pos('ERR:', dump[i]) = 1)
  911.             or
  912.            (pos('VerInfo: ', dump[i]) = 1)
  913.           then tmpsl.add(dump[i]);
  914.          if (pos('Builder done: ', dump[i]) = 1)
  915.             or
  916.            (pos('Final result ', dump[i]) = 1)
  917.           then tmpsl.Insert(0, dump[i]);
  918.         end;
  919.       a_summary.caption := 'Details';
  920.       memo1.clear;
  921.       memo1.lines.assign(tmpsl);
  922.       tmpsl.free;
  923.       dump.free;
  924.       end
  925.     else begin
  926.       Memo1.lines.LoadFromFile(builderobject.ProjectDir+'\dump.dat');
  927.       a_summary.caption := 'Summary';
  928.       end;
  929. end;
  930.  
  931. procedure TF_MainForm.A_retrieveLastDumpExecute(Sender: TObject);
  932. begin
  933.   L_results.caption := 'Last dump retrieved.';
  934.   Memo1.lines.loadFromFile(builderobject.ProjectDir+'\dump.dat');
  935.   b_save.Action := A_Summary;
  936. end;
  937.  
  938. procedure TF_MainForm.miContentsClick(Sender: TObject);
  939. begin
  940.   application.HelpContext(10);
  941. end;
  942.  
  943. procedure TF_MainForm.miAboutClick(Sender: TObject);
  944. begin
  945.   f_about := tf_about.create(nil);
  946.   f_about.showmodal;
  947.   f_about.free;
  948.  
  949. end;
  950.  
  951. end.
  952.